package br.com.sgpv2.controler.cargo;

import java.util.List;
import java.util.Locale;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;

import br.com.sgpv2.controler.SGPController;
import br.com.sgpv2.entity.JsonResponse;
import br.com.sgpv2.entity.cargos.CargoFuncao;
import br.com.sgpv2.service.cargo.CargoService;
import br.com.sgpv2.service.entidade.EntidadeService;

/**
 * Handles requests for the application /cargos.
 */

@Controller
public class CargoController extends SGPController {
	
	@Autowired
	private CargoService cargoService;
	
	@Autowired
	private EntidadeService entidadeService;
	
	/**
	 * Página de cargos - acessado pelo menu.
	 * @throws Exception.
	 */
	@RequestMapping(value = "/cargos", method = RequestMethod.GET)
	public String cargos(Locale locale, Model model) throws Exception {
		
		return listar(null, locale, model);
	}
	
	/**
	 * Página de cargos - acessado pela ação de pesquisar.
	 * @throws Exception.
	 */
	@RequestMapping(value = "/cargos", method = RequestMethod.POST)
	public String cargos(@RequestParam String descricao, Locale locale, Model model) throws Exception {
		
		return listar(descricao, locale, model);
	}
	
	private String listar(String descricao, Locale locale, Model model) {
		List<CargoFuncao> cargos = cargoService.consultarPorDescricao(descricao);

		configurarPaginacao(cargos, model);
		model.addAttribute("cargos", getPagedListHolder().getPageList());
		
		return "cargos";
	}
	
	/**
	 * avança para página de inclusão de cargo.
	 * @throws Exception 
	 */
	@RequestMapping(value = "/cargo/salvar", method = RequestMethod.GET)
	public String salvar(Model model) throws Exception {
	
		model.addAttribute("cargo", new CargoFuncao());
		
		return "cargo_incluir";		
	}
	
	/**
	 * inclui um cargo no sistema.
	 * @throws Exception 
	 */
	@RequestMapping(value = "/cargo/salvar", method = RequestMethod.POST)
	public String salvar(@ModelAttribute CargoFuncao cargo, Model model, BindingResult result) throws Exception {
				
		if(cargo != null){
			cargo.setEntidade(entidadeService.buscarEntidade());
			cargoService.salvar(cargo);
		}
		return "redirect:../cargos";
	}
	
	/**
	 * avança para página de alteração de cargo.
	 * @throws Exception 
	 */
	@RequestMapping(value = "/cargo/alterar/{pk}", method = RequestMethod.GET)
	public String getAlterar(@PathVariable Integer pk, Model model) throws Exception {
		CargoFuncao cargoFuncaoAlteracao = cargoService.buscar(pk);
		if(cargoFuncaoAlteracao != null){
			model.addAttribute("cargo",cargoFuncaoAlteracao);			
			return "cargo_alterar";
		}else{
			return "redirect:../cargos";
		}		
	}
	
	/**
	 * avança para página de alteração de cargo.
	 * @throws Exception 
	 */
	@RequestMapping(value = "/cargo/alterar", method = RequestMethod.POST)
	public String alterar(@ModelAttribute CargoFuncao cargoFuncao, Model model, BindingResult result) throws Exception {
			
		if(cargoFuncao != null){
			cargoFuncao.setEntidade(entidadeService.buscarEntidade());
			cargoService.alterar(cargoFuncao);
		}
		return "redirect:../cargos";
	}
	
	/**
	 * Exclui um cargo.
	 * @throws Exception 
	 */
	@RequestMapping(value = "/cargo/excluir/{pk}", method = RequestMethod.GET)
	public String excluir(@PathVariable Integer pk, Model model) throws Exception {
		CargoFuncao cargoFuncaoExclusao = cargoService.buscar(pk);
		
		if(cargoFuncaoExclusao !=null){
			cargoService.excluir(cargoFuncaoExclusao);
		}
		
		return "redirect:/cargos";
	}
	
	/**
	 * Valida a exclus�o de um cargo.
	 * @throws Exception 
	 */
	@ResponseBody
	@RequestMapping(value = "/cargo/validarExclusao/{idCargo}", method = RequestMethod.GET)
	public JsonResponse validarExclusao(@PathVariable String idCargo, Model model) throws Exception {		
		JsonResponse jsonResponse = new JsonResponse();
		jsonResponse.setSuccess(cargoService.validarExclusao(idCargo));				
		return jsonResponse;
	}
	
	@ResponseBody
	@RequestMapping(value = "/cargo/paginacao/{acao}", method = RequestMethod.GET)
	public ModelAndView paginacao(@PathVariable String acao, Model model) throws Exception {		
		navegarPaginacao(acao, model);
		model.addAttribute("cargos", getPagedListHolder().getPageList());
		return new ModelAndView("cargo.lista");
	}


}
